home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / msdos / ctest259.zip / LLL.PAS < prev    next >
Pascal/Delphi Source File  |  1991-05-09  |  13KB  |  480 lines

  1. {$A+,B-,D-,E+,F-,G-,I-,L-,N+,O-,R-,S-,V-,X-}
  2. {$M 4096,0,655360}
  3.  
  4. unit lll;
  5.  
  6. {    LAWRENCE LIVERMORE LOOPS (LLL)
  7.  
  8.  
  9.      PORTED TO TURBO-PASCAL 5.0 AND ENHANCED TO ALLOW FOR VARIABLE
  10.      LOOPING 89-05-27 BY N.J.
  11.  
  12. ***********************************************************************
  13.  
  14.      PROGRAM ANALYSIS EVALUATES EXECUTION RATES OF PASCAL FOR-LOOPS.
  15.      THROUGH-PUT IS MEASURED IN UNITS OF MILLIONS OF FLOATING-POINT
  16.      OPERATIONS PER SECOND, CALLED MFLOPS.
  17.  
  18.  
  19. ***********************************************************************
  20.  
  21. ***********************************************************************}
  22.  
  23. interface
  24.  
  25. FUNCTION MFlops (Emu: BOOLEAN; Index: DOUBLE): DOUBLE;
  26.  
  27. implementation
  28.  
  29. USES Time;
  30.  
  31.  
  32. VAR
  33. REPS: WORD;
  34. NT,IR,IX,IZ13,IZ14,IP,
  35. I1,J1,I2,J2,NL1,NL2,
  36. I,J,K,L,M,K1,KX,KY,LW,
  37. IT1:                     LONGINT;
  38. S,RI,XI,DU1,DU2,DU3,
  39. Q,R,T,A11,A12,A13,
  40. SIG,A21,A22,A23,A31,
  41. A32,A33,BM28,BM27,
  42. AR,BR,CR,BM26,BM25,BM24,
  43. BM23,BM22,C0,FLX,RX1:    DOUBLE;
  44. IDT,MOPS:                ARRAY [1..20] OF LONGINT;
  45. RT,RPM:                  ARRAY [1..20] OF DOUBLE;
  46. X,Y,Z,U:                 ARRAY [1..1000] OF DOUBLE;
  47. PX,CX:                   ARRAY [1..15,1..100] OF DOUBLE ABSOLUTE Z;
  48. U1,U2,U3:                ARRAY [1..22,1..5,1..2] OF DOUBLE;
  49. B,C,H:                   ARRAY [1..64,1..8] OF DOUBLE;
  50. BNK1,BNK2,BNK3,BNK4,BNK5:ARRAY [1..5] OF DOUBLE;
  51. P:                       ARRAY [1..4,1..512] OF DOUBLE ABSOLUTE X;
  52. E,F:                     ARRAY [1..192] OF LONGINT;
  53. EX,RH,DEX:               ARRAY [1..67] OF DOUBLE;
  54. VX,XX:                   ARRAY [1..150] OF DOUBLE;
  55.  
  56. CONST
  57.  
  58. NROPS: ARRAY [1..20] OF LONGINT =
  59.        (5,10,2,3,2,2,16,36,17,9,1,1,7,11,0,0,0,0,0,0);
  60. LOOPS: ARRAY [1..20] OF LONGINT =
  61.        (400,200,1000,343,996,996,120,40,100,100,999,999,128,150,0,0,0,0,0,0);
  62.  
  63.  
  64. {***********************************************************************}
  65. FUNCTION MFlops (Emu: BOOLEAN; Index: DOUBLE): DOUBLE;
  66.  
  67. BEGIN
  68.  
  69.    IF Emu THEN
  70.       Reps := 1
  71.    ELSE
  72.       Reps := Round (Index / 3 + 1);
  73.  
  74.    FOR K := 1 TO 1000 DO BEGIN
  75.       U[K] := 0.00025;
  76.       X[K] := 1.11;
  77.       Y[K] := 1.123;
  78.       Z[K] := 0.321;
  79.    END;
  80.  
  81.    FOR J := 1 TO 22 DO BEGIN
  82.       FOR K := 1 TO 5 DO BEGIN
  83.          FOR L := 1 TO 2 DO BEGIN
  84.             U1[J,K,L] := K;
  85.             U2[J,K,L] := K + K;
  86.             U3[J,K,L] := K + K + K;
  87.          END;
  88.       END;
  89.    END;
  90.  
  91.  
  92.    FOR J := 1 TO 64 DO BEGIN
  93.       FOR K := 1 TO 8 DO BEGIN
  94.          B[J,K] := 1.00025;
  95.          C[J,K] := 1.00025;
  96.          H[J,K] := 1.00025;
  97.       END;
  98.    END;
  99.  
  100.    FOR J := 1 TO 5 DO BEGIN
  101.       BNK1[J] := J*100;
  102.       BNK2[J] := J*110;
  103.       BNK3[J] := J*120;
  104.       BNK4[J] := J*130;
  105.       BNK5[J] := J*140;
  106.    END;
  107.  
  108.    FOR J := 1 TO 192 DO BEGIN
  109.       E[J] := 1;
  110.       F[J] := 1;
  111.    END;
  112.  
  113.  
  114.    FOR J := 1 TO 67 DO BEGIN
  115.       EX[J] := J;
  116.       RH[J] := J;
  117.       DEX[J]:= J;
  118.    END;
  119.  
  120.    FOR J := 1 TO 150 DO BEGIN
  121.       VX[J] := 0.001;
  122.       XX[J] := 0.001;
  123.    END;
  124.  
  125.    R := 4.86;
  126.    T := 276.0;
  127.    A11 := 0.5;
  128.    A12 := 0.33;
  129.    A13 := 0.25;
  130.    SIG := 0.8;
  131.    A21 := 0.20;
  132.    A22 := 0.167;
  133.    A23 := 0.141;
  134.    A31 := 0.125;
  135.    A32 := 0.111;
  136.    A33 := 0.10;
  137.    BM28 := 0.1;
  138.    BM27 := 0.2;
  139.    BM26 := 0.3;
  140.    BM25 := 0.4;
  141.    BM24 := 0.5;
  142.    BM23 := 0.6;
  143.    BM22 := 0.7;
  144.    C0 := 0.8;
  145.    FLX := 4.689;
  146.    RX1 := 64.0;
  147.  
  148. {********************************************************************
  149.  
  150.      END OF INITIALIZATION--BEGIN TIMING
  151.  
  152. {********************************************************************}
  153.  
  154. {*** LOOP 1    HYDRO EXCERPT }
  155.  
  156.       IT1 := CLOCK;
  157.       FOR K1 := 1 TO REPS DO BEGIN
  158.          Q := 0.0;
  159.          I := 10;
  160.          FOR K := 1 TO 400 DO BEGIN
  161.             X[K] := Q+Y[K]*(R*Z[K+I]+T*Z[K+I+1]);
  162.          END;
  163.       END;
  164.       IDT[1] := CLOCK - IT1;
  165.  
  166. {*********************************************************************}
  167.  
  168. {*** LOOP2     MLR, INNER PRODUCT }
  169.  
  170.       IT1 := CLOCK;
  171.       FOR K1 := 1 TO REPS DO BEGIN
  172.          Q := 0.0;
  173.          K := 1;
  174.          WHILE K <= 996 DO BEGIN
  175.             Q := Q+Z[K  ]*X[K  ]+Z[K+1]*X[K+1]
  176.                   +Z[K+2]*X[K+2]+Z[K+3]*X[K+3]
  177.                   +Z[K+4]*X[K+4];
  178.             INC (K,5);
  179.          END;
  180.       END;
  181.       IDT [2] := CLOCK - IT1;
  182.  
  183. {*********************************************************************}
  184.  
  185. {*** LOOP 3    INNER PROD }
  186.  
  187.       IT1 := CLOCK;
  188.       FOR K1 := 1 TO REPS DO BEGIN
  189.          Q := 0.0;
  190.          FOR K := 1 TO 1000 DO BEGIN
  191.             Q := Q+Z[K]*X[K];
  192.          END;
  193.       END;
  194.       IDT[3] := CLOCK - IT1;
  195.  
  196. {*********************************************************************}
  197.  
  198. {*** LOOP 4    BANDED LINEAR EQUATIONS }
  199.  
  200.       IT1 := CLOCK;
  201.       FOR K1 := 1 TO REPS DO BEGIN
  202.          L := 7;
  203.          WHILE L <= 107 DO BEGIN
  204.             LW := L;
  205.             J := 30;
  206.             WHILE J <= 870 DO BEGIN
  207.                X[L-1] := X[L-1] - X[LW]*Y[J];
  208.                INC (J,5);
  209.                INC (LW);
  210.             END;
  211.             X[L-1] := Y[5]*X[L-1];
  212.             INC (L,50);
  213.          END;
  214.       END;
  215.       IDT[4] := CLOCK - IT1;
  216.  
  217. {*********************************************************************}
  218.  
  219. {*** LOOP5 }
  220.  
  221.       IT1 := CLOCK;
  222.       FOR K1 := 1 TO REPS DO BEGIN
  223.          I := 2;
  224.          WHILE I <= 997 DO BEGIN
  225.             X[I  ] := Z[I  ]*(Y[I  ]-X[I-1]);
  226.             X[I+1] := Z[I+1]*(Y[I+1]-X[I  ]);
  227.             X[I+2] := Z[I+2]*(Y[I+2]-X[I+1]);
  228.             INC (I,3);
  229.          END;
  230.       END;
  231.       IDT[5] := CLOCK - IT1;
  232.  
  233. {*********************************************************************}
  234.  
  235. {*** LOOP6     TRI-DIAGONAL ELIMINATION, ABOVE DIAGONAL }
  236.  
  237.       IT1 := CLOCK;
  238.       FOR K1 := 1 TO REPS DO BEGIN
  239.          J := 3;
  240.          WHILE J <= 997 DO BEGIN
  241.             I := 1000-J;
  242.             X[I  ] := X[I  ]-Z[I  ]*X[I+1];
  243.             X[I-1] := X[I-1]-Z[I-1]*X[I  ];
  244.             X[I-2] := X[I-2]-Z[I-2]*X[I-1];
  245.             INC (J,3);
  246.          END;
  247.  
  248. { THE FOLLOWING LOOP HAS BEEN INSERTED AT THE UNIVERSITY
  249.   OF COLOGNE, BECAUSE IN THE ORIGINAL VERSION LOOP 6 ABORTED
  250.   WITH EXPONENT OVERFLOW ON IBM SYSTEMS. }
  251. (*
  252.          FOR J := 2 TO 997 DO BEGIN
  253.             X[J]:=X[J]*0.6666;
  254.          END;
  255. *)
  256.       END;
  257.  
  258.       IDT[6] := CLOCK - IT1;
  259.  
  260. {*********************************************************************}
  261.  
  262. {*** LOOP7     EQUATION OF STATE EXCERPT }
  263.  
  264.       IT1 := CLOCK;
  265.       FOR K1 := 1 TO REPS DO BEGIN
  266.          FOR M := 1 TO 120 DO BEGIN
  267.             X[M] :=    U[M  ] + R*(Z[M  ] + R*Y[M  ])
  268.                    +T*(U[M+3] + R*(U[M+2] + R*U[M+1])
  269.                    +T*(U[M+6] + R*(U[M+5] + R*U[M+4])));
  270.          END;
  271.       END;
  272.       IDT[7] := CLOCK - IT1;
  273.  
  274. {*********************************************************************}
  275.  
  276. {*** LOOP 8    P.D.E INTEGRATION }
  277.  
  278.       IT1 := CLOCK;
  279.       NL1 := 1;
  280.       NL2 := 2;
  281.       FOR K1 := 1 TO REPS DO BEGIN
  282.          FOR KX := 2 TO 3 DO BEGIN
  283.             FOR KY := 2 TO 21 DO BEGIN
  284.                DU1 := U1[KY+1,KX,NL1] - U1[KY-1,KX,NL1];
  285.                DU2 := U2[KY+1,KX,NL1] - U2[KY-1,KX,NL1];
  286.                DU3 := U3[KY+1,KX,NL1] - U3[KY-1,KX,NL1];
  287.                U1[KY,KX,NL2] := U1[KY,KX,NL1] + A11*DU1+A12*DU2 + A13*DU3 +
  288.                  SIG*(U1[KY,KX+1,NL1] - 2.*U1[KY,KX,NL1]+U1[KY,KX-1,NL1]);
  289.                U2[KY,KX,NL2] := U2[KY,KX,NL1] + A21*DU1+A22*DU2 + A23*DU3 +
  290.                  SIG*(U2[KY,KX+1,NL1] - 2.*U2[KY,KX,NL1]+U2[KY,KX-1,NL1]);
  291.                U3[KY,KX,NL2] := U3[KY,KX,NL1] + A31*DU1+A32*DU2 + A33*DU3 +
  292.                  SIG*(U3[KY,KX+1,NL1] - 2.*U3[KY,KX,NL1]+U3[KY,KX-1,NL1]);
  293.             END;
  294.          END;
  295.       END;
  296.       IDT[8] := CLOCK - IT1;
  297.  
  298. {*********************************************************************}
  299.  
  300. {*** LOOP 9    INTEGRATE PREDICTORS }
  301.  
  302.       FOR K := 1 TO 15 DO BEGIN
  303.          FOR L := 1 TO 100 DO BEGIN
  304.             PX[K,L] := L;
  305.             CX[K,L] := L;
  306.          END;
  307.       END;
  308.  
  309.       IT1 := CLOCK;
  310.       FOR K1 := 1 TO REPS DO BEGIN
  311.          FOR I := 1 TO 100 DO BEGIN
  312.             PX[1,I] := BM28*PX[13,I] + BM27*PX[12,I] + BM26*PX[11,I] +
  313.                        BM25*PX[10,I] + BM24*PX[9,I] + BM23*PX[8,I] +
  314.                        BM22*PX[7,I] + C0*(PX[5,I] + PX[6,I])+PX[3,I];
  315.          END;
  316.       END;
  317.       IDT[9] := CLOCK - IT1;
  318.  
  319. {*********************************************************************}
  320.  
  321. {*** LOOP 10   DIFFERENCE PREDICTORS }
  322.  
  323.       IT1 := CLOCK;
  324.       FOR K1 := 1 TO REPS DO BEGIN
  325.          FOR I := 1 TO 100 DO BEGIN
  326.             AR     :=      CX[5,I];
  327.             BR     := AR - PX[5,I];
  328.             PX[5,I]:= AR;
  329.             CR     := BR - PX[6,I];
  330.             PX[6,I]:= BR;
  331.             AR     := CR - PX[7,I];
  332.             PX[7,I]:= CR;
  333.             BR     := AR - PX[8,I];
  334.             PX[8,I]:= AR;
  335.             CR     := BR - PX[9,I];
  336.             PX[9,I]:= BR;
  337.             AR     := CR - PX[10,I];
  338.             PX[10,I]:=CR;
  339.             BR     := AR - PX[11,I];
  340.             PX[11,I]:=AR;
  341.             CR     := BR - PX[12,I];
  342.             PX[12,I]:=BR;
  343.             PX[14,I]:=CR - PX[13,I];
  344.             PX[13,I]:=CR;
  345.          END;
  346.       END;
  347.       IDT[10] := CLOCK - IT1;
  348.  
  349. {*********************************************************************}
  350.  
  351. {*** LOOP 11   FIRST SUM }
  352.  
  353.       IT1 := CLOCK;
  354.       FOR K1 := 1 TO REPS DO BEGIN
  355.          X[1] := Y[1];
  356.          FOR K := 2 TO 1000 DO BEGIN
  357.             X[K] := X[K-1]+Y[K];
  358.          END;
  359.       END;
  360.       IDT[11] := CLOCK - IT1;
  361.  
  362. {*********************************************************************}
  363.  
  364. {*** LOOP 12   FIRST DIFF. }
  365.  
  366.       IT1 := CLOCK;
  367.       FOR K1 := 1 TO REPS DO BEGIN
  368.          FOR K := 1 TO 999 DO BEGIN
  369.             X[K] := Y[K+1]-Y[K];
  370.          END;
  371.       END;
  372.       IDT[12] := CLOCK - IT1;
  373.  
  374. {*********************************************************************}
  375.  
  376. {*** LOOP 13   2-D PARTICLE PUSHER }
  377.  
  378.       IT1 := CLOCK;
  379.       FOR K1 := 1 TO REPS DO BEGIN
  380.          FOR J := 1 TO 4 DO BEGIN
  381.             FOR K := 1 TO 512 DO BEGIN
  382.                P[J,K] := 1.00025;
  383.             END;
  384.          END;
  385.          FOR IP := 1 TO 128 DO BEGIN
  386.             I1 := TRUNC (P[1,IP]);
  387.             J1 := TRUNC (P[2,IP]);
  388.             P[3,IP] := P[3,IP] + B[I1,J1];
  389.             P[4,IP] := P[4,IP] + C[I1,J1];
  390.             P[1,IP] := P[1,IP] + P[3,IP];
  391.             P[2,IP] := P[2,IP] + P[4,IP];
  392.             I2 := TRUNC (P[1,IP]);
  393.             J2 := TRUNC (P[2,IP]);
  394.             P[1,IP] := P[1,IP] + Y[I2+32];
  395.             P[2,IP] := P[2,IP] + Z[J2+32];
  396.             I2 := I2 + E[I2+32];
  397.             J2 := J2 + F[J2+32];
  398.             H[I2,J2] := H[I2,J2] + 1.0;
  399.          END;
  400.       END;
  401.       IDT[13] := CLOCK;
  402.       FOR K1 := 1 TO REPS DO BEGIN
  403.          FOR J := 1 TO 4 DO BEGIN
  404.             FOR K := 1 TO 512 DO BEGIN
  405.                P[J,K] := 1.00025;
  406.             END;
  407.          END;
  408.       END;
  409.       IDT[20] := CLOCK;
  410.       IZ13 := IDT[20] - IDT[13];
  411.       IDT[13] := 2*IDT[13] - IT1 - IDT[20];
  412.  
  413. {*********************************************************************}
  414.  
  415. {*** LOOP 14   1-D PARTICLE PUSHER }
  416.  
  417.       IT1 := CLOCK;
  418.       FOR K1 := 1 TO REPS DO BEGIN
  419.          FOR J := 1 TO 150 DO BEGIN
  420.             VX[J] := 0.001;
  421.             XX[J] := 0.001;
  422.          END;
  423.          FOR K := 1 TO 150 DO BEGIN
  424.             IX := 3+(K DIV 8);
  425.             XI := IX;
  426.             VX[K] := VX[K]+ EX[IX] + (XX[K]-XI) * DEX[IX];
  427.             XX[K] := XX[K]+ VX[K] + FLX;
  428.             IR := TRUNC(XX[K]);
  429.             RI := IR;
  430.             RX1:= XX[K]-RI;
  431.             IR := ABS (IR) AND 63;
  432.             XX[K]   := RI+RX1;
  433.             RH[IR]  := RH[IR] + 1.0 - RX1;
  434.             RH[IR+1]:= RH[IR+1] + RX1;
  435.          END;
  436.       END;
  437.       IDT[14] := CLOCK;
  438.       FOR K1 :=1 TO REPS DO BEGIN
  439.          FOR J := 1 TO 150 DO BEGIN
  440.             VX[J] := 0.001;
  441.             XX[J] := 0.001;
  442.          END;
  443.       END;
  444.       IDT[20] := CLOCK;
  445.       IZ14 := IDT[20] - IDT[14];
  446.       IDT[14] := 2*IDT[14] - IT1 - IDT[20];
  447.  
  448. {*********************************************************************}
  449.  
  450. {****TIME THE CLOCK CALL }
  451. {****CLOCK ROUTINE ARGUMENT IS MILLISECONDS }
  452.  
  453.       IT1 := CLOCK;
  454.       IDT[15] := CLOCK;
  455.       IDT[15] := IDT[15] - IT1;
  456.       NT := 14;
  457.          T := 0.0;
  458.          S := 0.0;
  459.          U[1] := 0.0;
  460.       FOR K := 1 TO NT DO BEGIN
  461.          RT[K] := IDT[K] - IDT[15];
  462.          T := T + RT[K];
  463.          MOPS [K] := NROPS [K] * LOOPS[K];
  464.          S := S + MOPS [K];
  465.          RPM [K] := 0.0;
  466.          IF RT[K] <> 0 THEN
  467.             RPM[K] := REPS*MOPS[K]/RT[K]/1000.0;
  468.          U[1] := U[1] + RPM[K];
  469.       END;
  470.       U[1] := U[1]/NT;
  471.       S := S/T;
  472.  
  473.       MFlops := U [1];
  474.    END;
  475. END.
  476.  
  477.  
  478.  
  479.  
  480.